package com.aaa.dang.modules.checkin.service.impl;

import cc.ebatis.impl.Init;
import cc.ebatis.pojo.ActionContext;
import com.aaa.dang.common.entity.UploadEntity;
import com.aaa.dang.common.systemlog.annotation.SysLog;
import com.aaa.dang.common.util.ResultModel;
import com.aaa.dang.common.util.UploadUtil;
import com.aaa.dang.modules.checkin.dao.CheckInDao;
import com.aaa.dang.modules.checkin.service.ICheckIn;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;


import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.*;


/**
 * @author 刘旭泽
 * @version 1.0
 * @date 2018/12/14
 * @description
 */
@Service
public class CheckInImpl implements ICheckIn {

    @Autowired
    private CheckInDao dao;

    /**
     * @return List<Room>
     * @description 获取页面展示的所有信息（空床信息）
     * @param[]
     * @author 刘旭泽
     * @date 2018/12/14
     **/
    @Override
    public ResultModel getAllMsg(Map<String, Object> query) {
        //query.get("page")+"" 转成String类型
        ResultModel model = new ResultModel();
        int pageNo = Integer.parseInt(query.get("page") + "");
        int pageSize = Integer.parseInt(query.get("limit") + "");
        PageHelper.startPage(pageNo, pageSize);
        model.setData(dao.getAllMsg(query));
        model.setCode(0);
        model.setMsg("");
        model.setCount(dao.getCount(query));
        return model;
    }

    /**
     * @param query
     * @return
     * @description 得到相应房间所有的空床位编号 用于办理入住选择床位下拉框动态展示
     * @author 刘旭泽
     * @date 2018/12/17
     **/
    @Override
    public List<Map<String, Object>> getEmptyBed(Map<String, Object> query) {

        List<Map<String, Object>> list = dao.getEmptyBed(query);
        return list;
    }

    /**
     * @param
     * @return com.aaa.dang.common.util.ResultModel
     * @description 往多张表中插入学生入住的信息, 往user表中插入user信息,
     * 往room表中更改信息,往room bed表中更改数据
     * 添加事物控制
     * @author 刘旭泽
     * @date 2018/12/17
     **/
    @Override
    @Transactional
    @SysLog(operateType = SysLog.Type.ADD, desc = "添加入住信息")
    public ResultModel addStuUser(Map<String, Object> query) {
        //判断该用户是否已经注册，如果有，证明该用户已经注册，没有,证明未注册用户
        Map<String, Object> mymap = dao.checkPhone(query);
        int a = 0;
        if (mymap == null) {
            //插入tbl_user表

            if ((query.get("payType") + "") != null) {
                int payType = Integer.parseInt(query.get("payType") + "");
                //payType==1表示入住办理交租方式是免租 end_time由前台获取
                //payType==0表示入住办理交租方式是按月交租 end_time字段是现在系统时间
                if (payType == 0) {
                    a = dao.addStuUser(query);
                } else {
                    a = dao.addStuUserByPayType(query);
                }
            }

        } else {

            //更改tbl_user表
            if ((query.get("payType") + "") != null) {
                int payType = Integer.parseInt(query.get("payType") + "");
                //payType==1表示入住办理交租方式是免租 end_time由前台获取
                //payType==0表示入住办理交租方式是按月交租 end_time字段是现在系统时间
                if (payType == 0) {
                    a = dao.updateStuUser(query);
                } else {
                    a = dao.updateStuUserByPayType(query);
                }
            }

        }

        //更改tbl_room表
        int b = Integer.parseInt(query.get("roomtype") + "");
        int c = Integer.parseInt(query.get("userSex") + "");
        //如果空房间第一个入住的是男生，这个房间就是男生寝室
        if (b == 2 && c == 1) {
            query.replace("roomtype", "2", "1");
        }
        //如果空房间第一个入住的是女生，这个房间就是女生寝室
        if (b == 2 && c == 0) {
            query.replace("roomtype", "2", "0");
        }
        //更改tbl_room表
        int d = dao.updateRoom(query);
        //更改room_user_bed表
        int e = dao.updateRoomUserBed(query);
        ResultModel model = new ResultModel();
        if (a > 0 && d > 0 && e > 0) {

            model.setCode(0);
            model.setMsg("入住成功");
        } else {
            model.setCode(1);
            model.setMsg("入住失败");
        }
        return model;
    }


    /**
     * @param
     * @return java.util.Map<java.lang.String               ,               java.lang.Object>
     * @description 入住办理输入手机号 ，input框失焦事件 发送请求 返回用户信息
     * @author 刘旭泽
     * @date 2018/12/19
     **/
    @Override
    public ResultModel checkPhone(Map<String, Object> query) {
        ResultModel model = new ResultModel();
        String value = String.valueOf(query.get("myphone"));
        if (value != null && value != "") {
            //判断该用户是否已经注册，如果有，证明该用户已经注册，没有证明,未注册用户
            Map<String, Object> map = dao.checkPhone(query);
            //判断该用户是否有退宿时间，如果有，证明是回归用户
            Map<String, Object> map2 = dao.checkRetireTime(query);
            //判断该用户是否有开始入住时间，如果有，证明已经办理了入住
            Map<String, Object> map3 = dao.checkStartTime(query);
            if (map != null && map2 != null) {
                model.setMsg("该用户为回归用户");
                model.setData(map);
            } else if (map != null && map3 == null) {
                model.setMsg("该用户已注册 未办理入住");
                model.setData(map);
            } else if (map != null && map3 != null) {
                model.setMsg("该用户已注册 并且已经办理入住");
            } else {
                model.setMsg("该用户未被注册");
            }
        } else {
            model.setMsg("请输入手机号");
        }
        return model;
    }

    /**
     * @return com.aaa.dang.common.util.ResultModel
     * @description 批量入住处理 插入数据库
     * @author 刘旭泽
     * @date 2018/12/26
     **/

    @Override
    public ResultModel uploadExcel(MultipartFile file, HttpServletRequest request) {

        ResultModel mod = new ResultModel();
        String contentType = file.getContentType();
        String fileName = file.getOriginalFilename();
        String uuid = UUID.randomUUID().toString();
        uuid = uuid.replace("-", "");
        //获取文件类型
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        fileName = uuid + suffixName;
        String filePath = request.getSession().getServletContext().getRealPath("excel/");
        //创建一个list  存放由于手机号已存在导入失败的数据的行数
        List list2 = new ArrayList();
        try {
            //上传文件
            UploadUtil.uploadFile(file.getBytes(), filePath, fileName);
           // mod.setMsg("上传成功");
            //处理excel 读取excel到实体类中
            File file1 = new File(filePath + fileName);
            Init<UploadEntity> init = new Init<UploadEntity>(file1, UploadEntity.class, false);
            ActionContext<UploadEntity> act = init.start();
            //act.getSheets() 返回的是一个数组
            //act.getSheets().get(0).getInfo() 返回一个数组
            List<UploadEntity> list = act.getSheets().get(0).getInfo();
            Map<String, Object> map = new HashMap<>();
            for (int i = 2; i < list.size(); i++) {
                map.put("phone", list.get(i).getUsername());
                map.put("myphone",list.get(i).getUsername());
                map.put("name", list.get(i).getName());
                map.put("userAddr", list.get(i).getUserAddr());
                if (list.get(i).getUserSex().equals("女")) {
                    map.put("userSex", "0");
                } else {
                    map.put("userSex", "1");
                }
                map.put("userCard", list.get(i).getUserCard());
                map.put("payphone", list.get(i).getPayphone());
                map.put("deposit", list.get(i).getDeposit());
                map.put("endTime", list.get(i).getEndTime());
                if (list.get(i).getPayType().equals("按月交租")) {
                    map.put("payType", 0);
                } else {
                    map.put("payType", 1);
                }
                map.put("roomNo", list.get(i).getRoomNo());
                map.put("bedNum", list.get(i).getBedNum());
                map.put("buildingName", list.get(i).getBuildingName());
                map.put("areaName", list.get(i).getAreaName());

                map.put("roomtype", "2");
                int id = dao.selectRooomId(map);
                map.put("roomid", id);
                int roomUserBedId = dao.selectRoomUserBedId(map);
                map.put("roomUserBedId", roomUserBedId);
                //判断手机号是否已注册
                Map<String,Object> pmap = dao.checkPhone(map);
                //判断床位号是否已被占用
                Map<String,Object> umap = dao.checkBedNum(roomUserBedId);
                if(pmap!=null||umap!=null){
                    list2.add(i);
                    continue;
                }
                mod = addStuUser(map);


            }


            mod.setCode(0);
            if(list2.size()==0){
                mod.setMsg("上传入住成功");
            }else{
                mod.setMsg("其它行上传入住成功"+list2.toString()+"行导入失败,请修改后重新导入");
            }

        } catch (Exception e) {
            mod.setCode(1);
            mod.setMsg("上传入住失败");
            return mod;
        }
        return mod;


    }


}
